:- module(ic_edge_finder3).
:- export cumulative / 5.
:- export cumulative / 4.
:- export disjunctive_bools / 3.
:- export disjunctive / 2.
:- comment(summary, "Cubic edge-finder algorithm for disjunctive and\ncumulative constraints for IC").
:- comment(author, "Joachim Schimpf").
:- comment(copyright, "Imperial College London and ICL").
:- comment(date, "$Date: 2002/07/26 13:25:02 $").
:- comment(desc, "\n    This library implements the cubic edge-finder algorithm for the\n    disjunctive and cumulative scheduling constraints for the IC solver.\n    It provides the strongest propagation of the three libraries for\n    cumulative constraints: ic_cumulative, ic_edge_finder and\n    ic_edge_finder3.  It is also computationally the most expensive.\n\n    Note that the same predicates are implemented in both ic_edge_finder\n    and ic_edge_finder3 libraries.\n").
:- comment(cumulative / 4, [amode : cumulative(+, +, +, ++), args : ["StartTimes" : "List of start times for tasks (fd variables or integers)", "Durations" : "List of duration for tasks (fd variables or integers)", "Resources" : "List of resource uages by tasks (fd variables or integers)", "ResourceLimit" : "Maximum amount of resource available (integer)"], summary : "Cumulative constraint on specified tasks.", see_also : [disjunctive / 2, cumulative / 5], desc : html("<P>\n   A cumulative scheduling constraint. StartTimes, Durations and Resources\n   are lists of equal length N of finite domain variable or integers.\n   ResourceLimit is an integer. The declarative meaning is:\n   If there are N tasks, each starting at a certain start time, having\n   a certain duration and consuming a certain (constant) amount of\n   resource, then the sum of resource usage of all the tasks does not\n   exceed ResourceLimit at any time.\n</P><P>\n   Any input variables which do not already have finite bounds will be\n   given default bounds of -10000000 to 10000000.\n</P><P>\n   This constraint can propagate more information than the implementation\n   in library(cumulative).\n</P>")]).
:- comment(cumulative / 5, [amode : cumulative(+, +, +, +, ++), args : ["StartTimes" : "List of start times for tasks (fd variables or integers)", "Durations" : "List of duration for tasks (fd variables or integers)", "Resources" : "List of resource usages by tasks (fd variables or integers)", "Areas" : "List of areas covered by tasks (fd variables or integers)", "ResourceLimit" : "Maximum amount of resource available (integer)"], summary : "Cumulative constraint on specified tasks.", see_also : [disjunctive / 2, cumulative / 5], desc : html("<P>\n   In this variant, an area (the product of duration and resource usage of\n   a task) can be specified, e.g. if duration or reource usage are not\n   known in advance. The edge-finder algorithm can make use of this information\n   to derive bound updates.\n</P><P>\n   Any input variables which do not already have finite bounds will be\n   given default bounds of -10000000 to 10000000.\n</P>\n")]).
:- comment(disjunctive / 2, [amode : disjunctive(+, +), args : ["StartTimes" : "List of start times for tasks (fd variables or integers)", "Durations" : "List of duration for tasks (fd variables or integers)"], summary : "Constraint the tasks with specified start times and durations do not overlap in time.", desc : html("<P>\n    A disjunctive scheduling constraint. StartTimes and Durations are lists\n    of equal length N of finite domain variable or integers.  The\n    declarative meaning is that the N tasks with certain start times and\n    duration do not overlap at any point in time.\n</P><P>\n    Any input variables which do not already have finite bounds will be\n    given default bounds of -10000000 to 10000000.\n</P>")]).
